package rn;

import entidades.UnidadeMilitar;
import entidades.Usuario;
import excessoes.DAOException;
import fabricas.DAOFabrica;
import interfaces.InterfaceUnidadeMilitarDAO;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.faces.application.FacesMessage;
import util.FacesUtil;
import entidades.LogEventos;

/**
 *
 * @author Marcelo Gomes Neto
 */
public class UnidadeMilitarRN {

    private InterfaceUnidadeMilitarDAO interfaceUnidadeMilitarDAO;

    public UnidadeMilitarRN() {
        this.interfaceUnidadeMilitarDAO = DAOFabrica.criarUnidadeMilitarDAO();
    }

    public UnidadeMilitar carregarUnidadeMilitar(Integer id) throws Exception {
        return this.interfaceUnidadeMilitarDAO.carregarUnidadeMilitar(id);
    }
    
    public void salvarUnidadeMilitar(UnidadeMilitar unidadeMilitar, Usuario usuario) throws DAOException, Exception
    {
        Integer id = unidadeMilitar.getIdunidade();
        String sigla = unidadeMilitar.getSiglaOM().toUpperCase().trim();
        String desc = unidadeMilitar.getDescricao().toUpperCase().trim();
        Integer idusu = usuario.getIdusuario();
        Integer idUnidadeUsuario = usuario.getPessoa().getUnidade();
        
        //VERIFICA SE EXISTE A DESCRIÇÃO DA OM
        List<UnidadeMilitar> resultado = this.interfaceUnidadeMilitarDAO.listarUnidadeMilitar();
        List<String> retornarDescricoes = new ArrayList<>();
        for (UnidadeMilitar unidade : resultado) 
        {
            String descricao = unidade.getDescricao().toUpperCase();
            retornarDescricoes.add(descricao);
        }

        //VERIFICA SE EXISTE A SIGLA DA OM
        List<UnidadeMilitar> resultadoSigla = this.interfaceUnidadeMilitarDAO.listarUnidadeMilitar();
        List<String> retornarSigla = new ArrayList<>();
        for (UnidadeMilitar om : resultadoSigla) {
            String descricaoSigla = om.getDescricao().toUpperCase();
            retornarSigla.add(descricaoSigla);
        }

        Date dataAtual = new Date(System.currentTimeMillis());
        String nomeUsuario = usuario.getPessoa().getPostoGraduacao()+" "+usuario.getPessoa().getNomeGuerra();
        
        //Obtem a sigla da OM
        UnidadeMilitar um = this.carregarUnidadeMilitar(idUnidadeUsuario);
        String sig = um.getSiglaOM();

        // Registra na tabela Log_Eventos
        LogEventos logEventos = new LogEventos();
        LogEventosRN logEventosRN = new LogEventosRN();
        logEventos.setIdusuario(idusu);
        logEventos.setDataEvento(dataAtual);
        
        if (id == null || id == 0)
        {
            if (retornarDescricoes.contains(desc)) {
                FacesUtil.getFacesContext().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Unidade militar " + desc + " já existe!", ""));
            }
            if (retornarSigla.contains(sigla)) {
                FacesUtil.getFacesContext().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Unidade militar " + sigla + " já existe!", ""));
            }
            if (!retornarDescricoes.contains(desc) && (!retornarSigla.contains(sigla)))
            {
                unidadeMilitar.setSiglaOM(sigla);
                unidadeMilitar.setDescricao(desc); // seta a OM com todas as letras maiúsculas
                this.interfaceUnidadeMilitarDAO.salvarUnidadeMilitar(unidadeMilitar);
                logEventos.setDescricao("o usuário "+nomeUsuario+" ("+sig+") cadastrou a unidade "+unidadeMilitar.getSiglaOM()+".");
                logEventosRN.salvarEvento(logEventos);
                FacesUtil.getFacesContext().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Cadastro efetuado com sucesso!", ""));
            }
        }
        else
        {
            unidadeMilitar.setSiglaOM(sigla);
            unidadeMilitar.setDescricao(desc);
            this.interfaceUnidadeMilitarDAO.alterarUnidadeMilitar(unidadeMilitar);
            
            logEventos.setDescricao("o usuário "+nomeUsuario+" ("+sig+") alterou os dados da unidade "+unidadeMilitar.getSiglaOM()+".");
            logEventosRN.salvarEvento(logEventos);
            FacesUtil.getFacesContext().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Cadastro alterado com sucesso!", ""));
        }
    }

    public void atualizarUnidadeMilitar(UnidadeMilitar unidadeMilitar) throws DAOException 
    {
        this.interfaceUnidadeMilitarDAO.alterarUnidadeMilitar(unidadeMilitar);
        FacesUtil.getFacesContext().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Cadastro alterado com sucesso!", ""));
    }
    
    public void excluirUnidadeMilitar(UnidadeMilitar unidadeMilitar, Usuario usuario) throws Exception 
    {
        Date dataAtual = new Date(System.currentTimeMillis());
        Integer IdUnidadeUsuario = usuario.getPessoa().getUnidade();
        //Obtem a sigla da OM
        UnidadeMilitar um = this.carregarUnidadeMilitar(IdUnidadeUsuario);
        String siglaOM = um.getSiglaOM();

        // Registra na tabela Log_Eventos
        LogEventos logEventos = new LogEventos();
        LogEventosRN logEventosRN = new LogEventosRN();
        logEventos.setIdusuario(usuario.getIdusuario());
        logEventos.setDataEvento(dataAtual);
        String nomeUsuario = usuario.getPessoa().getPostoGraduacao()+" "+usuario.getPessoa().getNomeGuerra();
        this.interfaceUnidadeMilitarDAO.excluirUnidadeMilitar(unidadeMilitar);
        
        logEventos.setDescricao("o usuário "+nomeUsuario+" ("+siglaOM+") excluiu a unidade "+unidadeMilitar.getSiglaOM()+".");
        logEventosRN.salvarEvento(logEventos);
        FacesUtil.getFacesContext().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Cadastro excluído com sucesso!", ""));
    }
    
    public List<UnidadeMilitar> listarUnidadeMilitar() {
        return this.interfaceUnidadeMilitarDAO.listarUnidadeMilitar();
    }
    
    public List<UnidadeMilitar> listarUnidadeMilitarDescricao() {
        return this.interfaceUnidadeMilitarDAO.listarUnidadeMilitarDescricao();
    }
    
    public List<String> listarTipo() {
        return this.interfaceUnidadeMilitarDAO.listarTipo();
    }
}